package com.demo.core.service.base;

import java.util.Date;

import com.demo.core.dao.base.support.ResultSearchResult;
import com.demo.core.dao.base.support.SearchArgumentSupport;
import com.demo.core.model.User;
import com.demo.core.service.exception.UserAlreadyExistedException;
import com.demo.core.service.exception.UserNotFoundOrPasswordErrorException;
import com.demo.security.service.UserAccessService;

/**
 * 用户服务接口 
 * 将用户安全访问接口与业务用户访问接口合并
 * 该服务为安全提供用户信息检索,同时为用户的业务提供服务
 * @author ryuu.kk
  */
public interface UserService extends UserAccessService {

	/**
	 * 用户存储 
	 * @param user 用户模型
	 * @return 用户外键ID
	 */
	Long save(User user) throws UserAlreadyExistedException;
	
	/**
	 * 用户存在
	 * @param id 主键ID
	 * @return 是否存在
	 */
	boolean exists(Long id);
	
	/**
	 * 用户存在
	 * @param userName 用户账户
	 * @return boolean
	 */
	boolean exists(String userName);
	
	/**
	 * 删除用户
	 * @param userId 用户ID
	 */
	void delete(Long userId);
	
	/**
	 * 用户可用
	 * @param id 外键ID
	 * @param enabled 可用标志
	 */
	void enable(Long id, boolean enabled);
	
	/**
	 * 锁定标志
	 * @param id 外键ID
	 * @param locked 锁定标志
	 */
	void lock(Long id, boolean locked);
	
	/**
	 * 有效标志
	 * @param id 外键ID
	 * @param isValid 有效标志
	 */
	void isValid(Long id, boolean isValid);
	
	/**
	 * 更新有效期限
	 * @param id 外键ID
	 * @param expireDay 有效期限日
	 */
	void expireDay(Long id, Date expireDay);
	
	/**
	 * 更新用户基本信息
	 * @param id 用户ID
	 * @param user 用户信息模型
	 */
	void update(Long id, User user);
	
	/**
	 * 重置密码（不进行密码校验）
	 * @param userId 用户ID
	 * @param newpassword 新密码
	 * @throws UserNotFoundOrPasswordErrorException
	 */
	void resetPassword(Long userId, String newpassword) throws UserNotFoundOrPasswordErrorException;
	
	/**
	 * 重置密码（带有原始密码校验）
	 * @param userId 用户ID
	 * @param oldpassword 旧密码
	 * @param newpassword 新密码
	 */
	void resetPassword(Long userId, String oldpassword, String newpassword) throws UserNotFoundOrPasswordErrorException;
	
	/**
	 * 重置密码（带有原始密码校验）
	 * @param userName 用户名
	 * @param oldpassword 旧密码
	 * @param newpassword 新密码
	 */
	void resetPassword(String userName, String oldpassword, String newpassword) throws UserNotFoundOrPasswordErrorException;
	
	/**
	 * 用户ID查找用户模型
	 * @param id 用户 ID
	 * @return 用户模型
	 */
	User find(Long id);
	
	/**
	 * 分页查询用户列表
	 * @param orderBy 排序字段
	 * @param firstResult 第一条位置
	 * @param maxResults 最大结果数
	 * @return 用户模型列表
	 */
	ResultSearchResult<User> search(String orderBy, int firstResult, int maxResults);
	
	/**
	 * 分页查询用户列表
	 * @param orderBy 排序字段
	 * @param firstResult 第一条位置
	 * @param maxResults 最大结果数
	 * @return 用户模型列表
	 */
	ResultSearchResult<User> search(SearchArgumentSupport args);

	// ~ 为其他接口提供服务 =======================================================
	/**
	 * 为其他接口提供用户检索服务
	 * @param userName 用户名
	 * @return User 用户模型
	 */
	User _find(String userName);
}
